


import bpy


from 全局控制.Node.节点和插座基类.bl_UpdateNode import *
from 对象操作 import bl_对象变换帧

import 全局控制.Node.节点和插座基类.bl_节点基类 as 基类
from 全局控制.Node.节点数据类型 import bl_集合数据类型

from bpy.types import Operator, Menu




def f_投影物体数量update(self, context):
	差数 = len(self.m_投影物体) - self.m_projector_count
	print('差数 = ', 差数)
	if 差数 > 0 :
		for i in range(差数):
			self.m_投影物体.remove(len(self.m_投影物体)-1)
	else:
		差数 = -差数
		for i in range(差数):
			self.m_投影物体.add()

class C_Node_UV投影修改器(基类.C_SN_基类):
	bl_dname = 'bl_node_UV投影修改器'
	bl_label = 'UV投影修改器'
	
	m_修改器名称 = bpy.props.StringProperty(name="修改器名称", default='UVProject')
	m_投影物体 = bpy.props.CollectionProperty(type=bl_集合数据类型.C_物体组元素)
	m_projector_count = bpy.props.IntProperty(update=f_投影物体数量update, min=0, max=4096)

	m_是否渲染 = bpy.props.BoolProperty()
	m_是否显示 = bpy.props.BoolProperty()
	m_是否编辑模式显示 = bpy.props.BoolProperty()
	#m_是否渲染 = bpy.props.BoolProperty()
	def init(self, context):
		super(C_Node_UV投影修改器, self).f_init(context)
		
		self.inputs.new('C_NodeSocket_文本', name='UV层名称')
		self.inputs.new('C_NodeSocket_物体', name='修改对象')
		self.inputs.new('C_插座_物体2D', name='投影物体')
		#self.inputs.new('C_NodeSocket_bool', name='是否隐藏')

	def draw_buttons(self, context, layout):
		#col.prop_search(md, "uv_layer", ob.data, "uv_layers")
		#layout.menu(C_修改器选择菜单.__name__, text=C_修改器选择菜单.bl_label)
		split = layout.split()
		col = split.column()
		显示选项布局 = col.row(align=True)
		显示选项布局.prop(self, 'm_是否渲染', icon='RESTRICT_RENDER_OFF', icon_only=True)
		显示选项布局.prop(self, 'm_是否显示', icon='RESTRICT_VIEW_OFF', icon_only=True)
		显示选项布局.prop(self, 'm_是否编辑模式显示', icon='EDITMODE_HLT', icon_only=True)
		
		col.separator()

		if self.inputs['投影物体'].is_linked == False :
			col.prop(self, "m_projector_count", text="Projectors")
			for proj in self.m_投影物体:
				col.prop(proj, "value", text="")
				

	def f_update(self, 是否向下传递=False, input插座=None):
		修改对象 = self.inputs['修改对象'].f_getData()
		if len(修改对象) <= 0 : return False

		投影物体 = []
		if self.inputs['投影物体'].is_linked:
			投影物体 = [self.inputs['投影物体'].f_getData()]
			print("A = 投影物体 = ", 投影物体, 修改对象)
		else:
			for i in self.m_投影物体:
				obj = i.value
				投影物体.append(obj)
			投影物体 = [投影物体]
			print("B = 投影物体 = ", 投影物体)

		UV层名称 = self.inputs['UV层名称'].f_getData()

		index = 0
		for obj in 修改对象:
			
			修改器ID = obj.modifiers.find(self.m_修改器名称)
			if 修改器ID >= 0 :
				修改器 = obj.modifiers[修改器ID]
			else:
				修改器 = obj.modifiers.new(self.m_修改器名称, 'UV_PROJECT')
				self.m_修改器名称 = 修改器.name
			
			修改器.uv_layer = UV层名称
			修改器.projector_count = len(投影物体[index] )
			子物体ID = 0
			for 子物体 in 投影物体[index] :
				#print('修改器.projectors = ', len(修改器.projectors), type(修改器.projectors), 修改器.projectors, obj, 子物体ID)
				#print('修改器.projectors = ', 修改器.projectors[子物体ID].object)
				修改器.projectors[子物体ID].object = 子物体
				子物体ID += 1
				
			#index += 1

		super(C_Node_UV投影修改器, self).f_update(是否向下传递, input插座)




class C_NODE_MENU_物体修改器(bpy.types.Operator):
	bl_idname = 'node.global_node_obj_modifiers_uvproject'
	bl_label = '物体修改器'
	bl_options = {'REGISTER', 'UNDO'}
	def execute(operator, context):
		bpy.ops.node.add_node(type='C_Node_UV投影修改器', use_transform=True)
		return {'FINISHED'}





classes = (
	C_Node_UV投影修改器,
	C_NODE_MENU_物体修改器,
	
)

def register():
	for c in classes:
		bpy.utils.register_class(c)
		
def unregister():
	for c in classes:
		bpy.utils.unregister_class(c)


